#ifndef _TASK_GROUP_H_
#define _TASK_GROUP_H_

#include <list>

#include "task.h"

namespace qb {
class ITaskGroupObserver {
 public:
  virtual void OnTaskStep(qb::NetStatus status, short ret_code) = 0;
  virtual void OnAllTaskFinished() = 0;
  virtual void OnTaskGroupFailed(qb::NetStatus status, short ret_code) = 0;
};

class CLoginConnectTask;
class CLoginVerifyTask;
class CLoginGwVerifyTask;
class CLoginAuthorityTask;

class CTaskGroup : public ITaskObserver {
 public:
  CTaskGroup(int nType = 0);
  ~CTaskGroup();

 public:
  // 获得正在运行的Task
  CTask* GetCurrentTask() const;

  // 添加一个Task
  void Append(CTask* pTask);

  // task是否已经执行完成
  bool IsAllTaskFinished();

  // 启动登录流程, bNeetRoute:true需要网络寻路, bNeetRoute:false不需要
  int32_t StartLoginSteps();

  // 构造登录步骤
  int32_t BuildLoginSteps();

  // 运行登录步骤
  int32_t RunLoginSteps();

  // 停止登录流程
  void StopLoginSteps();

  // 删除登录任务
  void DeleteTaskGroups();

  bool OnNetData(char* pData, int nDataLen);
  bool OnNetStatus(int32_t status);

  void SetObserver(ITaskGroupObserver* pObserver) {
    m_listObserver.push_back(pObserver);
  }

  // ITaskObserver
 protected:
  virtual void OnTaskStep(qb::NetStatus status, short ret_code);
  virtual void OnTaskFinished(CTask* pTask);
  virtual void OnTaskFailed(CTask* pTask, qb::NetStatus status, short ret_code);

 private:
  // 开始下一个任务
  void StartNextTask();

 private:
  std::list<CTask*> m_tasks;
  int m_nCurrentTask;
  int m_nTrys;

  CLoginConnectTask* m_pLoginConnectTask;      // 连接登录服务器
  CLoginVerifyTask* m_pLoginVerifyTask;        // 账号密码验证
  CLoginConnectTask* m_pGWConnectTask;         // 连接网关服务器
  CLoginGwVerifyTask* m_pLoginGwVerifyTask;    // cookie验证
  CLoginAuthorityTask* m_pLoginAuthorityTask;  // 用户权限请求
  std::list<ITaskGroupObserver*> m_listObserver;
};
}  // namespace qb

#endif
